<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
    <script>
      // const data = [
      //     { id: '01', name: '张大大', pid: '', job: '项目经理' },
      //     { id: '02', name: '小亮', pid: '01', job: '产品leader' },
      //     { id: '03', name: '小美', pid: '01', job: 'UIleader' },
      //     { id: '04', name: '老马', pid: '01', job: '技术leader' },
      //     { id: '05', name: '老王', pid: '01', job: '测试leader' },
      //     { id: '06', name: '老李', pid: '01', job: '运维leader' },
      //     { id: '07', name: '小丽', pid: '02', job: '产品经理' },
      //     { id: '08', name: '大光', pid: '02', job: '产品经理' },
      //     { id: '09', name: '小高', pid: '03', job: 'UI设计师' },
      //     { id: '10', name: '小刘', pid: '04', job: '前端工程师' },
      //     { id: '11', name: '小华', pid: '04', job: '后端工程师' },
      //     { id: '12', name: '小李', pid: '04', job: '后端工程师' },
      //     { id: '13', name: '小赵', pid: '05', job: '测试工程师' },
      //     { id: '14', name: '小强', pid: '05', job: '测试工程师' },
      //     { id: '15', name: '小涛', pid: '06', job: '运维工程师' }
      //   ]

      // // 转换树行数据的方法
      // function transTree (list) {
      //   // 接受一个返回的数组
      //   const treeData = []
        
      //   // 循环遍历得到每一条数据
      //   list.forEach(item => {
      //     // 判断item.pid是否为顶级对象
      //     if(!item.pid){
      //       // 如果为空则直接添加到数据中
      //       treeData.push(item)
      //     }
      //     // 通过filter 方法 过滤 得到每个的子级(数组)
      //     const children = list.filter(data => data.pid === item.id)
            
      //     // 如果数组长度为0 return结束循环开始下一次循环
      //     if(!children.length) return

      //     // 得到的数组添加到当前对象中
      //     item.children = children
      //   })

      //   // 把数组返回出去
      //   return treeData
      // }
      
      // const tree = transTree(data)
      // console.log(tree)


      // JS 中的常用的继承方式有哪些？以及各个继承方式的优缺点
      // ----------------------方法二：组合继承
    // 在子函数中运行父函数，但是要利用call把this改变一下，
    // 再在子函数的prototype里面new Father() ,使Father的原型中的方法也得到继承，最后改变Son的原型中的constructor
 
    // 缺点：调用了两次父类的构造函数，造成了不必要的消耗，父类方法可以复用
    // 优点可传参，不共享父类引用属性
    function Father(name) {
      this.name = name
      this.hobby = ["篮球", "足球", "乒乓球"]
    }
 
    Father.prototype.getName = function () {
      console.log(this.name);
    }
 
    function Son(name, age) {
      Father.call(this, name)
      this.age = age
    }
 
    Son.prototype = new Father()
    Son.prototype.constructor = Son
 
 
    var s = new Son("ming", 20)
 
    console.log(s);
 

    </script>
</body>
</html>